package app.productmanagement.web.Product.copyMapper;

import app.productmanagement.web.Product.Pojo.Product;
import app.productmanagement.web.Product.Pojo.dto.ProductRequest;
import app.productmanagement.web.Product.Pojo.vo.ProductVo;
import app.productmanagement.web.ProductAndTag.Pojo.ProductTag;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;

import java.util.List;

@Mapper(componentModel = "spring")
public abstract class copyProduct {
    /*  ProductRequest类中有如下属性：
            private String name; // 商品名称
            private Double price; // 商品价格
            private Integer stock; // 商品库存
            private Integer categoryId; // 商品分类ID
            private String description; // 商品描述
            private String detail; // 商品详情
            private String imageUrl; // 商品图片URL
            private List<ProductTag> tags; //标签 是数组 类型

     * Product类中有如下属性：
            private Integer id; // 商品ID (自动生成)
            //下面是商品的属性 (不可以为空)
            private String name; // 商品名称 (不可以为空)
            private Double price; // 商品价格 (不可以为负数)
            private Integer stock; // 商品库存 (不可以为负数 )
            private String detail; // 商品详情 (不可以为空)
            private Integer categoryId; // 商品类别 (不可以为空 有空默认值 为 1)
            //下面是商品的属性 (不可以为空)
            private String description; // 商品描述 (可以为空)
            private String imageUrl; // 商品图片URL (可以为空)
            private LocalDateTime createdAt; // 创建时间 (自动生成) 可以为空

       * ProductVo 类中有如下属性：
            private Integer id; // 商品ID
            private String name; // 商品名称
            private String description; // 商品描述
            private Categories category; // 商品类别
            private Integer price; // 商品价格
            private Integer stock; // 商品库存
            private String imageUrl; // 商品图片URL
            private List<ProductTagMultipleTables> tags; //标签 是数组

      * ProductDetailVo 类中有如下属性：
            private Integer id; // 商品ID
            private String name; // 商品名称
            private String description; // 商品描述
            private String detail; // 商品详情
            private Categories category; // 商品分类
            private Double price; // 商品价格
            private Integer stock; // 商品库存
            private String imageUrl; // 商品图片URL
            private List<ProductTagMultipleTables> tags; //标签 是数组



       * ProductLimitVo 类中有如下属性：
            private List<ProductVo> products;
            private Long total;//总页码数
            private Long page;//(可选): 页码，默认值为 1。
            private Long limit;//(可选): 每页显示的商品数量，默认值为 10。
     * */

    //ProductRequest转换为Product类
    @Mappings({@Mapping(target = "Product.id", ignore = true), @Mapping(target = "Product.createdAt", ignore = true)})
    public abstract Product copyProductRequestToProduct(ProductRequest productRequest);

    // 获取ProductRequest中的tags并设置productId
    public List<ProductTag> getTagsFromProductRequestAndSetProductId(Integer id, ProductRequest productRequest) {
        List<ProductTag> tags = productRequest.getTags();
        tags.forEach(tag -> {
            tag.setProductId(id);
        });
        return tags;
    }


    //Product转换为ProductVo类
    @Mappings(value = {@Mapping(target = "tags", ignore = true),
            //TODO: 这里忽略category，因为ProductVo中没有category属性
            @Mapping(target = "category", ignore = true)})
    public abstract ProductVo copyProductToProductVo(Product product);

}
